﻿using System;
using System.Collections;

namespace Lesson1_ArrayList
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 注意
            //不建议使用ArrayList类进行开发  建议改用泛型List<T>类  ArrayList旨在保存对象的异类集合。
            //当添加或检索值类型时  会发生装箱拆箱(内存迁移)  导致增大性能消耗。
            #endregion

            #region 一 ArrayList的本质
            //ArrayList的本质是一个C#封装好的类
            //它是一个object类型的数组
            //ArrayList类已经为我们封装好了很多方法
            //比如 增删查改
            #endregion

            #region 二 如何申明
            //使用ArrayList需要引用 System.Collections 命名空间
            ArrayList arr = new ArrayList();
            ArrayList arr2 = new ArrayList(10);     //可以自定义ArrayList的初始容量
            #endregion

            #region 三 增删查改
            //增
            //由于ArrayList的组成元素是object类型 所以可以添加任意类型元素 遵循里氏替换原则
            arr.Add(1);
            arr.Add("hello");
            arr.Add('H');
            arr.Add(true);
            arr.Add(new Test());
            arr.Add(new object());
            arr.Add('H');
            arr2.Add(10086);
            //将arr2中的所有元素添加到列表中(最后一位)
            arr.AddRange(arr2);
            Console.WriteLine(arr[7]);

            //删
            //按元素删除
            arr.Remove(1);
            Console.WriteLine(arr[0]);
            //按索引删除
            arr.RemoveAt(0);
            Console.WriteLine(arr[0]);
            //清空
            //arr.Clear();

            //查
            //按索引查找
            Console.WriteLine(arr[0]);
            //检查指定元素是否存在
            if (arr.Contains(10086))
            {
                Console.WriteLine("element exist");
            }
            //正向查找元素位置(返回元素位置索引 若不存在 返回-1)
            Console.WriteLine(arr.IndexOf('H'));
            Console.WriteLine(arr.IndexOf(1234567));
            //反向查找元素位置
            Console.WriteLine(arr.LastIndexOf('H'));

            //改
            //(string不能这样使用 因为string类的索引器是只读的)
            arr[0] = "LiberTy";
            Console.WriteLine(arr[0]);
            #endregion

            Console.WriteLine("***************");

            #region 四 获取ArrayList长度与容量
            //长度
            Console.WriteLine(arr.Count);
            Console.WriteLine(arr2.Count);
            //容量
            Console.WriteLine(arr.Capacity);
            Console.WriteLine(arr2.Capacity);
            #endregion

            Console.WriteLine("***************");

            #region 五 遍历(迭代器遍历)
            //item 前写数组元素类型
            //in 后写需要遍历的数组名
            foreach(object item in arr)
            {
                Console.WriteLine(item);
            }
            //item 可改名
            foreach (object a in arr)
            {
                Console.WriteLine(a);
            }
            #endregion
        }
    }
    class Test
    {

    }
}